/* 
 * ExceptionHandlerInterceptor.java
 * 
 * Data de criação: 09/04/2010
 * 
 * O2SOLUTIONS - SOLUÇÕES EM TECNOLOGIA DA INFORMAÇÃO. 
 *
 */
package br.com.o2solutions.core.aop.exception;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import br.com.o2solutions.core.exception.BusinessException;
import br.com.o2solutions.core.exception.CoreException;
import br.com.o2solutions.core.exception.SystemException;
import br.com.o2solutions.core.exception.enumerator.ExceptionScope;
import br.com.o2solutions.core.service.Service;
import br.com.o2solutions.util.bean.BeanUtil;

/**
 * Interceptador para as excecoes lancadas pelas chamadas a classes do nucleo
 * dos sistemas tipificando-as.
 * 
 * @author osvaldeir
 * @since 09/04/2010
 * 
 */
@Aspect
public class ExceptionHandlerInterceptor {

	private Logger log = LoggerFactory
			.getLogger(ExceptionHandlerInterceptor.class);

	/**
	 * Metodo que intercepta as excecoes lancadas pelas subclasses que
	 * implementam a interface {@link Service} capturando e convertendo-as em
	 * excecoes sistemicas (caso não sejam negociais).
	 * 
	 * @param pjp
	 *            Objeto referente ao evento OAP ocorrido
	 * @return Object Retorno do metodo
	 * @throws Throwable
	 *             Caso alguma falha ocorra (Sistemica ou Negocial)
	 */
	@Around("execution (public * * (..)) && @within(org.springframework.stereotype.Service) && !execution (public * *.set*(..))")
	public Object invokeService(ProceedingJoinPoint pjp) throws Throwable {
		Object result = null;
		try {
			log.debug("Realizando a interceptacao do metodo ".concat(pjp
					.getSignature().getName()));
			result = pjp.proceed();
			return result;
		} catch (BusinessException e) {
			throw e;
		} catch (Throwable e) {
			throw new SystemException("Erro ao realizar a operação", e);
		}
	}
}
